/**
 * 运行时依赖检查工具
 * 用于检查必要的依赖是否已安装，避免运行时错误
 */
import type { App } from 'vue'

// 核心依赖列表
export const CORE_DEPENDENCIES = [
  'vue',
  'element-plus',
  '@element-plus/icons-vue'
]

// 可选依赖（按需使用时才需要）
export const OPTIONAL_DEPENDENCIES = [
  'axios',
  'dayjs',
  'lodash-es',
  'echarts', 
  'vue-router',
  '@vueuse/core',
  'vue-i18n',
  'big.js',
  'cropperjs',
  'driver.js',
  'echarts-wordcloud',
  'mitt',
  'nprogress',
  'sortablejs',
  'vue-types',
  'web-storage-cache',
  '@wangeditor/editor',
  '@wangeditor/editor-for-vue',
  '@zxcvbn-ts/core',
  '@zxcvbn-ts/language-common',
  'jsencrypt'
]

// 组件与依赖的映射关系
export const COMPONENT_DEPENDENCIES: Record<string, string[]> = {
  'Echart': ['echarts'],
  'Editor': ['@wangeditor/editor', '@wangeditor/editor-for-vue'],
  'Cropper': ['cropperjs'],
  'Form': ['@vueuse/core']
}

/**
 * 检查是否在开发环境中
 * @returns 是否在开发环境
 */
function isDevEnvironment(): boolean {
  return process.env.NODE_ENV === 'development' || 
         typeof process !== 'undefined' && process.env.NODE_ENV === 'development' ||
         typeof import.meta !== 'undefined' && import.meta.env && import.meta.env.DEV === true
}

/**
 * 检查依赖是否已安装
 * @param dependency 依赖名称
 * @returns 依赖是否已安装
 */
export function isDependencyInstalled(dependency: string): boolean {
  // 在开发环境中，假定所有依赖都已安装
  if (isDevEnvironment()) {
    return true
  }

  try {
    // 检查全局对象中是否存在该依赖
    if (typeof window !== 'undefined') {
      // 浏览器环境
      const globalVarMap: Record<string, string> = {
        'vue': 'Vue',
        'element-plus': 'ElementPlus',
        '@element-plus/icons-vue': 'ElementPlusIconsVue',
        'axios': 'axios',
        'dayjs': 'dayjs',
        'lodash-es': '_',
        'echarts': 'echarts',
        'vue-router': 'VueRouter',
        '@vueuse/core': 'VueUse',
        'vue-i18n': 'VueI18n'
      }
      
      const globalVar = globalVarMap[dependency]
      if (globalVar && (window as any)[globalVar]) {
        return true
      }
    }
    
    // 动态导入检查
    const moduleExists = require.resolve(dependency)
    return !!moduleExists
  } catch (error) {
    // 如果是Vue依赖，在开发环境中特殊处理
    if (dependency === 'vue' && isDevEnvironment()) {
      return true
    }
    return false
  }
}

/**
 * 检查Element Plus是否已注册（全局或在应用中）
 * @param app Vue应用实例（可选）
 * @returns 是否已注册
 */
export function isElementPlusRegistered(app?: App): boolean {
  if (app) {
    return isElementPlusRegisteredInApp(app)
  }
  return isElementPlusRegisteredGlobally()
}

/**
 * 检查Element Plus是否已经注册到Vue应用中
 * @param app Vue应用实例
 * @returns 是否已注册
 */
export function isElementPlusRegisteredInApp(app: App): boolean {
  try {
    // 检查应用上下文中是否有Element Plus组件
    return !!(
      app._context && 
      app._context.components && 
      (app._context.components.ElButton || app._context.components['el-button'])
    )
  } catch (error) {
    return false
  }
}

/**
 * 检查Element Plus是否已经全局注册
 * @returns 是否已全局注册
 */
export function isElementPlusRegisteredGlobally(): boolean {
  try {
    if (typeof window === 'undefined' || !window.document) {
      return false
    }
    
    // 检查是否存在典型的Element Plus组件
    const elButtonExists = !!window.document.querySelector('.el-button')
    
    // 检查全局Vue中是否注册了Element Plus组件
    const app = (window as any)['__VUE_APP__']
    const hasElInApp = app && app._context && app._context.components && 
                      app._context.components.ElButton !== undefined
    
    return elButtonExists || hasElInApp
  } catch (error) {
    return false
  }
}

/**
 * 验证组件库所需依赖是否都已安装
 * 用于在组件库被导入时进行检查
 */
export function validateDependencies(): void {
  // 在开发环境中不进行检查
  if (isDevEnvironment()) {
    console.info('EPMS Element: Running in development mode, skipping dependency checks')
    return
  }

  // 控制台分组显示依赖检查结果
  if (typeof console !== 'undefined' && console.groupCollapsed) {
    console.groupCollapsed('EPMS Element: Dependencies check')
    
    // 检查核心依赖
    let allDepsOK = true
    CORE_DEPENDENCIES.forEach((dep: string) => {
      const isInstalled = isDependencyInstalled(dep)
      if (!isInstalled) {
        allDepsOK = false
        console.error(`Missing required dependency: ${dep}`)
      } else {
        console.info(`✓ ${dep}`)
      }
    })
    
    if (allDepsOK) {
      console.info('✅ All required dependencies are installed')
    } else {
      console.warn('⚠️ Some required dependencies are missing. EPMS Element may not function correctly.')
    }
    
    console.groupEnd()
  }
} 